package org.brisling.service.common;

import java.util.ArrayList;
import java.util.List;

import org.brisling.domain.common.ListDomain;
import org.brisling.domain.sysman.inf.BizBeanDataModeler;
import org.brisling.repository.inf.ListByDeptRepository;
import org.brisling.util.JsonUtil;
import org.brisling.util.LongUtil;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
/**
 * 
 * 根据部门信息进行数据过滤的业务类方法，需要按照部门信息过滤实体数据的业务必须继承该基类
 * @author : jackson wang
 * @Date   : 2015年6月8日 下午9:47:33
 * @version: 1.0
 * @param <T> 泛型需定义的业务类实体
 */
public class BaseListByDeptService<T extends BizBeanDataModeler>{

	//定义起始页是否为1
	private Boolean pageBasedOne=false;
	
	/**
	 * easyui前端数据要求进行封装，按照部门信息进行过滤的实体类集合，并提供分页功能
	 * @param deptid 部门唯一编码
	 * @param page 页号
	 * @param pageSize 每页显示数量
	 * @param repo 数据仓库接口
	 * @return 按照total和rows封装的easyui数据集合
	 */
	public ListDomain<T> getPagedListByDeptid(String deptid,String page,String pageSize,
			ListByDeptRepository<T,Long> repo){
		
		Integer _deptid = LongUtil.getIntValue(deptid, null);
		Integer _page = LongUtil.getIntValue(page, 0);
		Integer _pageSize = LongUtil.getIntValue(pageSize, 10);
		
		
		ListDomain<T> listDomain = new ListDomain<T>();
		//dept为空，返回空值对象
		if(_deptid==null){
			listDomain.setTotal(0l);
			listDomain.setRows(new ArrayList<T>());
			return listDomain;
		}
	
		if(!pageBasedOne)
			_page -= 1;
		
		PageRequest _pageRequest = 
				new PageRequest(_page,_pageSize,new Sort(new String[] { "sortedid" }));
		
		Long _total = repo.countByDeptid(new Long(_deptid));
		List<T> _usrList = repo.findByDeptid(new Long(_deptid), _pageRequest);		
		
		listDomain.setTotal(_total);
		listDomain.setRows(_usrList);
		
		return listDomain;
		
	}
	
	/**
	 * 无分页及前端封装，根据部门信息进行过滤的业务实体集合
	 * @param deptid 部门信息
	 * @param repo 数据仓库接口
	 * @return 业务实体集合
	 */
	public List<T> getList(String deptid,ListByDeptRepository<T,Long> repo){
		
		Long _deptid = LongUtil.getLongValue(deptid, null);
		
		if(_deptid==null)
			return new ArrayList<T>();
		
		List<T> ite = repo.findByDeptid(_deptid, new Sort(new String[] { "sortedid" }));
		
		return ite;
		
	}
	
	/**
	 * 保存实体对象
	 * @param repo 数据仓库接口
	 * @param t 实体对象
	 * @return 操作状态码
	 */
	public T save(ListByDeptRepository<T,Long> repo,T t){
		return (T) repo.save(t);
	}
	
	/**
	 * 删除实体对象
	 * @param repo 数据仓库接口
	 * @param id 实体唯一编码
	 * @return  操作状态码
	 */
	public String del(ListByDeptRepository<T,Long> repo,String id){
		Long _id = LongUtil.getLongValue(id, null);
		if(_id!=null){
			repo.delete(_id);
			return "200";
		}else{
			return "id must not be null !";
		}
	}
	
	@SuppressWarnings({ "rawtypes", "unchecked" })
	/**
	 * json数据对象转换
	 * @param body json数据对象
	 * @param clazz 反序列化类实例
	 * @return 实例化的clazz对象
	 */
	public T  bodyToObj (String body,Class clazz){
		
		return (T) JsonUtil.bodyToObj(body, clazz);
	}
}
